<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AIfES 2: aiopti Struct Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script>
<script type="text/javascript" async="async" src="https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="AIfES_logo_small.png"/></td>
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">AIfES 2
   &#160;<span id="projectnumber">2.0.0</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('structaiopti.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="summary">
<a href="#pub-attribs">Data Fields</a>  </div>
  <div class="headertitle">
<div class="title">aiopti Struct Reference</div>  </div>
</div><!--header-->
<div class="contents">

<p>AIfES optimizer interface.  
 <a href="structaiopti.html#details">More...</a></p>

<p><code>#include &lt;<a class="el" href="aifes__core_8h_source.html">aifes_core.h</a>&gt;</code></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
Data Fields</h2></td></tr>
<tr class="memitem:a6ca0fdd2169bc462e1cc4f87e786933d"><td class="memItemLeft" align="right" valign="top"><a id="a6ca0fdd2169bc462e1cc4f87e786933d"></a>
const <a class="el" href="structaicore__optitype.html">aicore_optitype_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaiopti.html#a6ca0fdd2169bc462e1cc4f87e786933d">optimizer_type</a></td></tr>
<tr class="memdesc:a6ca0fdd2169bc462e1cc4f87e786933d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Type of the optimizer (for example aiopti_sgd_type) <br /></td></tr>
<tr class="separator:a6ca0fdd2169bc462e1cc4f87e786933d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a137684e527116392d2672299bc93b95c"><td class="memItemLeft" align="right" valign="top"><a id="a137684e527116392d2672299bc93b95c"></a>
void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaiopti.html#a137684e527116392d2672299bc93b95c">optimizer_configuration</a></td></tr>
<tr class="memdesc:a137684e527116392d2672299bc93b95c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optimizer specific configurations (back-link from abstract aiopti class to implementation) <br /></td></tr>
<tr class="separator:a137684e527116392d2672299bc93b95c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abf7a461af7296a09d5246ca13591b988"><td class="memItemLeft" align="right" valign="top"><a id="abf7a461af7296a09d5246ca13591b988"></a>
const <a class="el" href="structaimath__dtype.html">aimath_dtype_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaiopti.html#abf7a461af7296a09d5246ca13591b988">dtype</a></td></tr>
<tr class="memdesc:abf7a461af7296a09d5246ca13591b988"><td class="mdescLeft">&#160;</td><td class="mdescRight">The data-type of the parameter that the optimizer can optimize and the learning rate. <br /></td></tr>
<tr class="separator:abf7a461af7296a09d5246ca13591b988"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aafeaaeb2f574aee6bb461dac6bc9ddfb"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaiopti.html#aafeaaeb2f574aee6bb461dac6bc9ddfb">learning_rate</a></td></tr>
<tr class="memdesc:aafeaaeb2f574aee6bb461dac6bc9ddfb"><td class="mdescLeft">&#160;</td><td class="mdescRight">The learning rate configures the training speed.  <a href="structaiopti.html#aafeaaeb2f574aee6bb461dac6bc9ddfb">More...</a><br /></td></tr>
<tr class="separator:aafeaaeb2f574aee6bb461dac6bc9ddfb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a948b4e86692cb9306c71c1099a6ba67d"><td class="memItemLeft" align="right" valign="top">uint32_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaiopti.html#a948b4e86692cb9306c71c1099a6ba67d">sizeof_optimem</a> )(<a class="el" href="structaiopti.html">aiopti_t</a> *self, const <a class="el" href="structaitensor.html">aitensor_t</a> *params)</td></tr>
<tr class="memdesc:a948b4e86692cb9306c71c1099a6ba67d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculates the optimization memory size for a trainable parameter tensor.  <a href="structaiopti.html#a948b4e86692cb9306c71c1099a6ba67d">More...</a><br /></td></tr>
<tr class="separator:a948b4e86692cb9306c71c1099a6ba67d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a39e07b6004587fae3c9b12b1821ef066"><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaiopti.html#a39e07b6004587fae3c9b12b1821ef066">init_optimem</a> )(<a class="el" href="structaiopti.html">aiopti_t</a> *self, const <a class="el" href="structaitensor.html">aitensor_t</a> *params, const <a class="el" href="structaitensor.html">aitensor_t</a> *gradients, void *optimem)</td></tr>
<tr class="memdesc:a39e07b6004587fae3c9b12b1821ef066"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initialize the optimization memory for a trainable parameter tensor.  <a href="structaiopti.html#a39e07b6004587fae3c9b12b1821ef066">More...</a><br /></td></tr>
<tr class="separator:a39e07b6004587fae3c9b12b1821ef066"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae145c9527c45c9c98fe7a0b317245e66"><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaiopti.html#ae145c9527c45c9c98fe7a0b317245e66">zero_gradients</a> )(<a class="el" href="structaiopti.html">aiopti_t</a> *self, <a class="el" href="structaitensor.html">aitensor_t</a> *gradients)</td></tr>
<tr class="memdesc:ae145c9527c45c9c98fe7a0b317245e66"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the gradient tensor to zero.  <a href="structaiopti.html#ae145c9527c45c9c98fe7a0b317245e66">More...</a><br /></td></tr>
<tr class="separator:ae145c9527c45c9c98fe7a0b317245e66"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5b82d583ac0602253e07aaea992d4e3f"><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaiopti.html#a5b82d583ac0602253e07aaea992d4e3f">begin_step</a> )(<a class="el" href="structaiopti.html">aiopti_t</a> *self)</td></tr>
<tr class="memdesc:a5b82d583ac0602253e07aaea992d4e3f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called in the beginning of every model optimization step for parameter initialization.  <a href="structaiopti.html#a5b82d583ac0602253e07aaea992d4e3f">More...</a><br /></td></tr>
<tr class="separator:a5b82d583ac0602253e07aaea992d4e3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a833b900d14688a649c1037466adf444b"><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaiopti.html#a833b900d14688a649c1037466adf444b">update_params</a> )(<a class="el" href="structaiopti.html">aiopti_t</a> *self, <a class="el" href="structaitensor.html">aitensor_t</a> *params, const <a class="el" href="structaitensor.html">aitensor_t</a> *gradients, void *optimem)</td></tr>
<tr class="memdesc:a833b900d14688a649c1037466adf444b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Performs an optimization step on the given tensor.  <a href="structaiopti.html#a833b900d14688a649c1037466adf444b">More...</a><br /></td></tr>
<tr class="separator:a833b900d14688a649c1037466adf444b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae52778f5409e29c7f25cc4ee9ff66f55"><td class="memItemLeft" align="right" valign="top">void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structaiopti.html#ae52778f5409e29c7f25cc4ee9ff66f55">end_step</a> )(<a class="el" href="structaiopti.html">aiopti_t</a> *self)</td></tr>
<tr class="memdesc:ae52778f5409e29c7f25cc4ee9ff66f55"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called in the end of every model optimization step.  <a href="structaiopti.html#ae52778f5409e29c7f25cc4ee9ff66f55">More...</a><br /></td></tr>
<tr class="separator:ae52778f5409e29c7f25cc4ee9ff66f55"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>AIfES optimizer interface. </p>
<div class="image">
<img src="aiopti.png" alt="" width="300px"/>
</div>
<p>The interface contains the necessary functions and parameters for parameter optimizers in backpropagation training. (Refer to <a class="el" href="aifes__core_8h.html" title="AIfES 2 core interface.">aifes_core.h</a> for a structural overview)<br  />
Optimizers are responsible for updating the trainable parameters of the model with the gradients calculated in the backward pass.</p>
<p>The call order of the functions is:<br  />
</p><div class="fragment"><div class="line">allocate memory of size <a class="code" href="structaiopti.html#a948b4e86692cb9306c71c1099a6ba67d">sizeof_optimem</a>()</div>
<div class="line"><a class="code" href="structaiopti.html#a39e07b6004587fae3c9b12b1821ef066">init_optimem</a>()</div>
<div class="line"> </div>
<div class="line">for batch in dataset</div>
<div class="line">    for each trainable parameter tensor in the model</div>
<div class="line">        <a class="code" href="structaiopti.html#ae145c9527c45c9c98fe7a0b317245e66">zero_gradients</a>()</div>
<div class="line">    endfor</div>
<div class="line"> </div>
<div class="line">    forward_model(batch)</div>
<div class="line">    backward_model(batch)</div>
<div class="line"> </div>
<div class="line">    <a class="code" href="structaiopti.html#a5b82d583ac0602253e07aaea992d4e3f">begin_step</a>()</div>
<div class="line">    for each trainable parameter tensor in the model</div>
<div class="line">        <a class="code" href="structaiopti.html#a833b900d14688a649c1037466adf444b">update_params</a>()</div>
<div class="line">    endfor</div>
<div class="line">    <a class="code" href="structaiopti.html#ae52778f5409e29c7f25cc4ee9ff66f55">end_step</a>()</div>
<div class="line">endfor</div>
<div class="ttc" id="astructaiopti_html_a39e07b6004587fae3c9b12b1821ef066"><div class="ttname"><a href="structaiopti.html#a39e07b6004587fae3c9b12b1821ef066">aiopti::init_optimem</a></div><div class="ttdeci">void(* init_optimem)(aiopti_t *self, const aitensor_t *params, const aitensor_t *gradients, void *optimem)</div><div class="ttdoc">Initialize the optimization memory for a trainable parameter tensor.</div><div class="ttdef"><b>Definition:</b> aifes_core.h:459</div></div>
<div class="ttc" id="astructaiopti_html_a5b82d583ac0602253e07aaea992d4e3f"><div class="ttname"><a href="structaiopti.html#a5b82d583ac0602253e07aaea992d4e3f">aiopti::begin_step</a></div><div class="ttdeci">void(* begin_step)(aiopti_t *self)</div><div class="ttdoc">Called in the beginning of every model optimization step for parameter initialization.</div><div class="ttdef"><b>Definition:</b> aifes_core.h:472</div></div>
<div class="ttc" id="astructaiopti_html_a833b900d14688a649c1037466adf444b"><div class="ttname"><a href="structaiopti.html#a833b900d14688a649c1037466adf444b">aiopti::update_params</a></div><div class="ttdeci">void(* update_params)(aiopti_t *self, aitensor_t *params, const aitensor_t *gradients, void *optimem)</div><div class="ttdoc">Performs an optimization step on the given tensor.</div><div class="ttdef"><b>Definition:</b> aifes_core.h:481</div></div>
<div class="ttc" id="astructaiopti_html_a948b4e86692cb9306c71c1099a6ba67d"><div class="ttname"><a href="structaiopti.html#a948b4e86692cb9306c71c1099a6ba67d">aiopti::sizeof_optimem</a></div><div class="ttdeci">uint32_t(* sizeof_optimem)(aiopti_t *self, const aitensor_t *params)</div><div class="ttdoc">Calculates the optimization memory size for a trainable parameter tensor.</div><div class="ttdef"><b>Definition:</b> aifes_core.h:450</div></div>
<div class="ttc" id="astructaiopti_html_ae145c9527c45c9c98fe7a0b317245e66"><div class="ttname"><a href="structaiopti.html#ae145c9527c45c9c98fe7a0b317245e66">aiopti::zero_gradients</a></div><div class="ttdeci">void(* zero_gradients)(aiopti_t *self, aitensor_t *gradients)</div><div class="ttdoc">Set the gradient tensor to zero.</div><div class="ttdef"><b>Definition:</b> aifes_core.h:466</div></div>
<div class="ttc" id="astructaiopti_html_ae52778f5409e29c7f25cc4ee9ff66f55"><div class="ttname"><a href="structaiopti.html#ae52778f5409e29c7f25cc4ee9ff66f55">aiopti::end_step</a></div><div class="ttdeci">void(* end_step)(aiopti_t *self)</div><div class="ttdoc">Called in the end of every model optimization step.</div><div class="ttdef"><b>Definition:</b> aifes_core.h:487</div></div>
</div><!-- fragment --> </div><h2 class="groupheader">Field Documentation</h2>
<a id="a5b82d583ac0602253e07aaea992d4e3f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5b82d583ac0602253e07aaea992d4e3f">&#9670;&nbsp;</a></span>begin_step</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void(* begin_step) (<a class="el" href="structaiopti.html">aiopti_t</a> *self)</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Called in the beginning of every model optimization step for parameter initialization. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">self</td><td>The layer </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="ae52778f5409e29c7f25cc4ee9ff66f55"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae52778f5409e29c7f25cc4ee9ff66f55">&#9670;&nbsp;</a></span>end_step</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void(* end_step) (<a class="el" href="structaiopti.html">aiopti_t</a> *self)</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Called in the end of every model optimization step. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">self</td><td>The layer </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="a39e07b6004587fae3c9b12b1821ef066"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a39e07b6004587fae3c9b12b1821ef066">&#9670;&nbsp;</a></span>init_optimem</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void(* init_optimem) (<a class="el" href="structaiopti.html">aiopti_t</a> *self, const <a class="el" href="structaitensor.html">aitensor_t</a> *params, const <a class="el" href="structaitensor.html">aitensor_t</a> *gradients, void *optimem)</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Initialize the optimization memory for a trainable parameter tensor. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">self</td><td>The layer </td></tr>
    <tr><td class="paramname">params</td><td>The trainable parameter tensor </td></tr>
    <tr><td class="paramname">gradients</td><td>The associated gradients tensor </td></tr>
    <tr><td class="paramname">optimem</td><td>The associated optimization memory to initialize </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="aafeaaeb2f574aee6bb461dac6bc9ddfb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aafeaaeb2f574aee6bb461dac6bc9ddfb">&#9670;&nbsp;</a></span>learning_rate</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void* learning_rate</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>The learning rate configures the training speed. </p>
<p>The learning rate is an aiscalar_t value of given dtype. </p>

</div>
</div>
<a id="a948b4e86692cb9306c71c1099a6ba67d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a948b4e86692cb9306c71c1099a6ba67d">&#9670;&nbsp;</a></span>sizeof_optimem</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">uint32_t(* sizeof_optimem) (<a class="el" href="structaiopti.html">aiopti_t</a> *self, const <a class="el" href="structaitensor.html">aitensor_t</a> *params)</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Calculates the optimization memory size for a trainable parameter tensor. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">self</td><td>The layer </td></tr>
    <tr><td class="paramname">params</td><td>The trainable parameter tensor </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="a833b900d14688a649c1037466adf444b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a833b900d14688a649c1037466adf444b">&#9670;&nbsp;</a></span>update_params</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void(* update_params) (<a class="el" href="structaiopti.html">aiopti_t</a> *self, <a class="el" href="structaitensor.html">aitensor_t</a> *params, const <a class="el" href="structaitensor.html">aitensor_t</a> *gradients, void *optimem)</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Performs an optimization step on the given tensor. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">self</td><td>The layer </td></tr>
    <tr><td class="paramname">params</td><td>The trainable parameter tensor </td></tr>
    <tr><td class="paramname">gradients</td><td>The associated gradients tensor </td></tr>
    <tr><td class="paramname">optimem</td><td>The associated optimization memory to initialize </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="ae145c9527c45c9c98fe7a0b317245e66"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae145c9527c45c9c98fe7a0b317245e66">&#9670;&nbsp;</a></span>zero_gradients</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void(* zero_gradients) (<a class="el" href="structaiopti.html">aiopti_t</a> *self, <a class="el" href="structaitensor.html">aitensor_t</a> *gradients)</td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Set the gradient tensor to zero. </p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">self</td><td>The layer </td></tr>
    <tr><td class="paramname">params</td><td>The gradient tensor </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<hr/>The documentation for this struct was generated from the following file:<ul>
<li><a class="el" href="aifes__core_8h_source.html">aifes_core.h</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="structaiopti.html">aiopti</a></li>
    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </li>
  </ul>
</div>
</body>
</html>
